package persistencia;

import Exepciones.ExcepcionesSys.ExcepcionConexionErrorSys;
import java.sql.Connection;
import java.util.ArrayList;
import persistencia.MySQL.MysqlDAOFactory;
import persistencia.derby.DerbyDAOFactory;
import persistencia.postgre.PostgreDAOFactory;

/**
 * Clase que abstrae todo el comportamiento común de las clases DAOFactory
 */
public abstract class DAOFactory {

    protected String idDB;
    protected String DRIVER_DB;
    protected String URL_DB;
    protected String USUARIO_DB;
    protected String CLAVE_DB;

    /**
     * @param driver o libreria de la base de datos
     * @param url de la base de datos
     * @param usuario de la base de datos
     * @param clave de la base de datos
     */

    protected DAOFactory(String driver, String url, String usuario, String clave) {
        DRIVER_DB = driver;
        URL_DB = url;
        USUARIO_DB = usuario;
        CLAVE_DB = clave;
    }

    /**
     * Crea y retorna una Factory según sea el indice de la DB ingresado.
     * @param indice u opción de selección de la Base de Datos
     * @param driver o libreria de la base de datos
     * @param url de la base de datos
     * @param usuario de la base de datos
     * @param clave de la base de datos
     * @return DAOFactory correspondiente al indice de selección
     */
    public static DAOFactory getDAOFactory(int indice, String driver, String url, String usuario, String clave) {
        DAOFactory interfaz = null;
        switch (indice) {
            case 1: {
                interfaz = DerbyDAOFactory.crear(driver, url, usuario, clave);
                break;
            }
            case 2: {
                interfaz = PostgreDAOFactory.crear(driver, url, usuario, clave);
                break;
            }
            case 3: {
                interfaz = MysqlDAOFactory.crear(driver, url, usuario, clave);
                break;
            }
        }
        return interfaz;
    }

    /**
     * Este metodo crea las conexiones de las Factoris para luego
     * retornar un Array de ellos
     * @return Array de Factoris
     */
    public static ArrayList<DAOFactory> getFactorys() {
        ArrayList<DAOFactory> lista = new ArrayList<DAOFactory>();

        DAOFactory derbyDAOFactory = DAOFactory.getDAOFactory(1, "org.apache.derby.jdbc.EmbeddedDriver", "jdbc:derby:/Users/ivanpianetti/¬TimeMachine/DBTraductor/traductor", "bipiane", "bipiane");
        DAOFactory postgresDAOFactory = DAOFactory.getDAOFactory(2, "org.postgresql.Driver", "jdbc:postgresql://localhost:5432/Traductor", "postgres", "bipiane");
        DAOFactory mysqlDAOFactory = DAOFactory.getDAOFactory(3, "com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/traductor", "root", "");

        lista.add(derbyDAOFactory);
        lista.add(postgresDAOFactory);
        lista.add(mysqlDAOFactory);

        return lista;
    }

    /**
     *
     * @return Nombre único de la base de datos
     */
    @Override
    public String toString() {
        return idDB;
    }

    public abstract Connection getConexion() throws ExcepcionConexionErrorSys;

    public abstract void cerrarConexion(Connection conexion) throws ExcepcionConexionErrorSys;

    public abstract RegistroTraduccionDAO getRegistroTraduccionDAO() throws ExcepcionConexionErrorSys;
}
